/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pua.uniandes.servicios;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import javax.ejb.Singleton;
import pua.uniandes.entities.Mision;
import pua.uniandes.entities.TramaDatos;

/**
 *
 * @author jd.velasquez3209
 */
@Singleton
public class ReporteMisionesBean implements ReporteMisionesBeanRemote {

    // ----------------------------------------------------------
// Atributos
// ----------------------------------------------------------
    private ArrayList<Mision> misiones;
    private Mision misionActual;
    private static final String ARCHIVO_PERSISTENCIA = "E:/Coding/Workspace NetBeans/trunk/ArqueSoft/Experimento1/persistencia.config";

    // ----------------------------------------------------------------------
// Constructor
// ----------------------------------------------------------------------
    public ReporteMisionesBean() {
        misiones = new ArrayList<Mision>();

        File archivo = new File(ARCHIVO_PERSISTENCIA);
        if (archivo.exists()) {
            // El archivo existe: se debe recuperar de allí el estado del modelo del mundo
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(archivo));
                misiones = (ArrayList) ois.readObject();
                ois.close();
            } catch (Exception e) {
                e.printStackTrace();

            }
        } else {
            // El archivo no existe: es la primera vez que se ejecuta el programa
            misiones = new ArrayList<Mision>();
            inicializarDatosIniciales();
        }
    }


// ----------------------------------------------------------------------
// Metodos Creacion
// ----------------------------------------------------------------------
    @Override
    public void crearMision(String nomMision, String nomCohete, Date fechaCreacion) throws Exception {

        Mision m = new Mision(nomMision, nomCohete, fechaCreacion);
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();

            if (mision.getNombreMision().equals(nomMision)) {
                throw new Exception("Ya existe una mision con ese nombre");
            }

        }

        misiones.add(m);
        System.out.println("Si se pudo crear la misión" +nomMision);
        System.out.println("El tamaño del arreglo de misiones es ahora "+misiones.size());

    }

    @Override
    public void guardarTrama(double aceleracionX, double aceleracionY, double aceleracionZ,double altura,double potencia, double temperatura,Date tiempo) {
        System.out.println("si entro acá");
        if(misionActual==null)
        {
            System.out.println("LA PUTA MISION ESTA NULA");
        }
        System.out.println("Misión acual."+misionActual.getNombreMision()+" mas info "+misionActual.toString());

        misionActual.guardarTrama(aceleracionX, aceleracionY, aceleracionZ, altura, potencia, temperatura, tiempo);

    }

    @Override
    public boolean iniciarMision(String m) throws Exception{
        for (int i = 0; i < misiones.size(); i++) {
            Mision mision = misiones.get(i);
            System.out.println("MisiónActual:"+i+"cuyo nombre es "+mision.getNombreMision());
            if (mision.getNombreMision().equals(m)) {
                System.out.println("Misión:"+mision.getNombreMision());
                misionActual = mision;
                misionActual.setEnOperacion(true);
                return true;
            }
        }
        return false;
    }

    @Override
    public void terminarMision() throws Exception {

        misionActual.setFechaFin(new Date(System.currentTimeMillis()));
        misionActual.calcularDatosAnalisis();
        misionActual.setEnOperacion(false);

        persistirMision();

    }

    @Override
    public void persistirMision() throws Exception {

        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(ARCHIVO_PERSISTENCIA));
            oos.writeObject(misiones);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

// ----------------------------------------------------------------------
// Metodos Reporte
// ----------------------------------------------------------------------
    @Override
    public String[] getListadoMisiones() {

        String[] nombres = new String[misiones.size()];

        for (int i = 0; i < misiones.size(); i++) {
            Mision mision = misiones.get(i);
            if (!mision.isEnOperacion()) {
                nombres[i] = mision.getNombreMision();
            }

        }

        return nombres;

    }

    @Override
    public String[] getDatosAnalisis(String nomMision) throws Exception {


        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();
            if (mision.getNombreMision().equals(nomMision)) {
                return mision.getDatosAnalisis();
            }

        }
        throw new Exception("No se encontro una mision con ese nombre");
    }

    @Override
    public Date getFechaCreacionMision(String nomMision) throws Exception {
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();
            if (mision.getNombreMision().equals(nomMision)) {
                return mision.getFechaCreacion();
            }

        }
        throw new Exception("No se encontro una mision con ese nombre");
    }

    @Override
    public Date getFechaDespegueMision(String nomMision) throws Exception {
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();
            if (mision.getNombreMision().equals(nomMision)) {
                return mision.getFechaDespegue();
            }

        }
        throw new Exception("No se encontro una mision con ese nombre");
    }

    @Override
    public Date getFechaFinMision(String nomMision) throws Exception {
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();
            if (mision.getNombreMision().equals(nomMision)) {
                return mision.getFechaFin();
            }

        }
        throw new Exception("No se encontro una mision con ese nombre");
    }

    @Override
     public byte[] getArchivoReporte(String nomMision) throws Exception {

        Mision mision = null;
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision i = it.next();
            if (i.getNombreMision().equals(nomMision)) {
                mision = i;
            }

        }

        if (mision == null) {
            throw new Exception("No se encontro la mision que se desea reportar");
        }
        ArrayList<TramaDatos> tramas = mision.getTramas();

        String archivo="Numero de la trama; Aceleracion X ; Aceleracion Y ; Acelearcion Z; Altura ; Potencia ; Temperatura ; Tiempo\n";

        for (int i = 0; i < tramas.size(); i++) {
            TramaDatos tramaDatos = tramas.get(i);
            archivo+=   tramaDatos.getId() + ";";
            archivo+=tramaDatos.getAceleracionX() + ";";
            archivo+=tramaDatos.getAceleracionY() + ";";
            archivo+=tramaDatos.getAceleracionZ() + ";";
            archivo+=tramaDatos.getAltura() + ";";
            archivo+=tramaDatos.getPotencia() + ";";
            archivo+=tramaDatos.getTemperatura() + ";";
            archivo+=tramaDatos.getTiempo() + ";\n";
        }
        byte[] bite= archivo.getBytes();
        return bite;
    }

     public Mision getMision(String nomMision) throws Exception {
        for (Iterator<Mision> it = misiones.iterator(); it.hasNext();) {
            Mision mision = it.next();
            if (mision.getNombreMision().equals(nomMision)) {
                return mision;
            }
        }
        throw new Exception("No se encontro una mision con ese nombre");
    }

     private void inicializarDatosIniciales() {
        DateFormat df= new SimpleDateFormat("dd/MM/yyyy");
        for (int i = 1; i <= 6; i++) {
            try {
                Mision mision=new Mision("Lanzamiento numero "+i, "Cohete numero "+i, df.parse("2"+i+"/4/2012"));
                mision.setEnOperacion(false);
                mision.setFechaFin(df.parse("30/12/2012"));
                mision.setFechaDespegue(df.parse("19/11/2012"));
                mision.setTramas(inicializarTramas());
            misiones.add(mision);
            } catch (ParseException ex) {
               ex.printStackTrace();
            }

        }
        
    }

    private ArrayList<TramaDatos> inicializarTramas() {
        ArrayList<TramaDatos> resp= new ArrayList<TramaDatos>();
        for (int i = 0; i < 6; i++) {
            TramaDatos tramaDatos = new TramaDatos(i, (i+100), (i+100), (i+100), (i+10), (i+10), 11, new Date(System.currentTimeMillis()+i*100));
            resp.add(tramaDatos);
        }
        return resp;
    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
}
